home *** CD-ROM | disk | FTP | other *** search
/ Visual Cafe 3 / Visual Cafe 3.ISO / Vcafe / JFC.bin / MacSliderUI.java < prev    next >
Text File  |  1998-06-30  |  15KB  |  454 lines

  1. /*
  2.  * @(#)MacSliderUI.java    1.8 98/02/02
  3.  *
  4.  * Copyright (c) 1997 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * This software is the confidential and proprietary information of Sun
  7.  * Microsystems, Inc. ("Confidential Information").  You shall not
  8.  * disclose such Confidential Information and shall use it only in
  9.  * accordance with the terms of the license agreement you entered into
  10.  * with Sun.
  11.  *
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
  13.  * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  14.  * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  15.  * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
  16.  * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
  17.  * THIS SOFTWARE OR ITS DERIVATIVES.
  18.  *
  19.  */
  20.  
  21. package com.sun.java.swing.plaf.mac;
  22.  
  23. import com.sun.java.swing.plaf.basic.BasicSliderUI;
  24.  
  25. import java.awt.Component;
  26. import java.awt.Container;
  27. import java.awt.Graphics;
  28. import java.awt.Dimension;
  29. import java.awt.Rectangle;
  30. import java.awt.Point;
  31. import java.awt.Insets;
  32. import java.awt.Color;
  33. import java.io.Serializable;
  34. import java.awt.IllegalComponentStateException;
  35. import java.awt.Polygon;
  36. import java.beans.*;
  37.  
  38. import java.awt.event.MouseListener;
  39. import java.awt.event.MouseEvent;
  40.  
  41. import com.sun.java.swing.border.AbstractBorder;
  42.  
  43. import com.sun.java.swing.*;
  44. import com.sun.java.swing.event.*;
  45. import com.sun.java.swing.plaf.*;
  46.  
  47. /**
  48.  * Mac Slider
  49.  * <p>
  50.  * Warning: serialized objects of this class will not be compatible with
  51.  * future swing releases.  The current serialization support is appropriate
  52.  * for short term storage or RMI between Swing1.0 applications.  It will
  53.  * not be possible to load serialized Swing1.0 objects with future releases
  54.  * of Swing.  The JDK1.2 release of Swing will be the compatibility
  55.  * baseline for the serialized form of Swing objects.
  56.  *
  57.  * @version @(#)MacSliderUI.java    1.0 11/24/97
  58.  * @author Symantec
  59.  */
  60. public class MacSliderUI extends BasicSliderUI implements MouseListener
  61. {
  62.     // Enabled state
  63.     private static final int ENABLED = 0;
  64.     private static final int PRESSED = 1;
  65.     private static final int DISABLED = 2;
  66.  
  67.     // Orientation
  68.     private static final int CENTER = 0;
  69.     private static final int RIGHT = 1;
  70.     private static final int DOWN = 1;
  71.  
  72.     private static final int TICK_LENGTH = 8;
  73.     private static final int TRACK_OVERHANG = 4;    // The track hangs past the thumb by this much at each end
  74.     private static final int TRACK_WIDTH = 7;
  75.  
  76.     private static final int PREFERRED_LENGTH = 164;
  77.  
  78.     private static ImageIcon[][][] indicatorIcons = null;
  79.     private static Color tickColorEnabled;
  80.     private static Color tickColorDisabled;
  81.     private static Color tickHilite;
  82.     private static Color tickShadow;
  83.  
  84.     private static Color trackBorderEnabled;
  85.     private static Color trackFillEnabled;
  86.     private static Color trackBorderDisabled;
  87.     private static Color trackFillDisabled;
  88.     private static Color trackBevelIn;
  89.     private static Color trackBevelOut;
  90.  
  91.     private boolean drawSliderPressed = false;
  92.  
  93.     protected ActivationHelper activationHelper;
  94.     protected ChangeListener changeListener;
  95.     protected boolean isActive = true;
  96.  
  97.     public static ComponentUI createUI(JComponent c)
  98.     {
  99.         return new MacSliderUI((JSlider) c);
  100.     }
  101.  
  102.     public MacSliderUI(JSlider c)
  103.     {
  104.         super(c);
  105.     }
  106.  
  107.     public void installUI( JComponent c )
  108.     {
  109.         if (indicatorIcons == null)
  110.         {
  111.             indicatorIcons = new ImageIcon[2][3][2];
  112.             
  113.             indicatorIcons[JSlider.HORIZONTAL][ENABLED][CENTER]    = (ImageIcon) UIManager.getIcon("Slider.indicatorHorizontalEnabled");
  114.             AppearanceFilter.FilterImageIcon(c,indicatorIcons[JSlider.HORIZONTAL][ENABLED][CENTER]);
  115.             indicatorIcons[JSlider.HORIZONTAL][ENABLED][DOWN]    = (ImageIcon) UIManager.getIcon("Slider.indicatorHorizontalDownEnabled");
  116.             AppearanceFilter.FilterImageIcon(c,indicatorIcons[JSlider.HORIZONTAL][ENABLED][DOWN]);
  117.             indicatorIcons[JSlider.HORIZONTAL][PRESSED][CENTER]    = (ImageIcon) UIManager.getIcon("Slider.indicatorHorizontalPressed");
  118.             AppearanceFilter.FilterImageIcon(c,indicatorIcons[JSlider.HORIZONTAL][PRESSED][CENTER]);
  119.             indicatorIcons[JSlider.HORIZONTAL][PRESSED][DOWN]    = (ImageIcon) UIManager.getIcon("Slider.indicatorHorizontalDownPressed");
  120.             AppearanceFilter.FilterImageIcon(c,indicatorIcons[JSlider.HORIZONTAL][PRESSED][DOWN]);
  121.             indicatorIcons[JSlider.HORIZONTAL][DISABLED][CENTER]= (ImageIcon) UIManager.getIcon("Slider.indicatorHorizontalDisabled");
  122.             indicatorIcons[JSlider.HORIZONTAL][DISABLED][DOWN]    = (ImageIcon) UIManager.getIcon("Slider.indicatorHorizontalDownDisabled");
  123.  
  124.             indicatorIcons[JSlider.VERTICAL][ENABLED][CENTER]    = (ImageIcon) UIManager.getIcon("Slider.indicatorVerticalEnabled");
  125.             AppearanceFilter.FilterImageIcon(c,indicatorIcons[JSlider.VERTICAL][ENABLED][CENTER]);
  126.             indicatorIcons[JSlider.VERTICAL][ENABLED][RIGHT]    = (ImageIcon) UIManager.getIcon("Slider.indicatorVerticalRightEnabled");
  127.             AppearanceFilter.FilterImageIcon(c,indicatorIcons[JSlider.VERTICAL][ENABLED][RIGHT]);
  128.             indicatorIcons[JSlider.VERTICAL][PRESSED][CENTER]    = (ImageIcon) UIManager.getIcon("Slider.indicatorVerticalPressed");
  129.             AppearanceFilter.FilterImageIcon(c,indicatorIcons[JSlider.VERTICAL][PRESSED][CENTER]);
  130.             indicatorIcons[JSlider.VERTICAL][PRESSED][RIGHT]    = (ImageIcon) UIManager.getIcon("Slider.indicatorVerticalRightPressed");
  131.             AppearanceFilter.FilterImageIcon(c,indicatorIcons[JSlider.VERTICAL][PRESSED][RIGHT]);
  132.             indicatorIcons[JSlider.VERTICAL][DISABLED][CENTER]    = (ImageIcon) UIManager.getIcon("Slider.indicatorVerticalDisabled");
  133.             indicatorIcons[JSlider.VERTICAL][DISABLED][RIGHT]    = (ImageIcon) UIManager.getIcon("Slider.indicatorVerticalRightDisabled");
  134.  
  135.  
  136.             tickColorEnabled = UIManager.getColor("Slider.tickColorEnabled");
  137.             tickColorDisabled = UIManager.getColor("Slider.tickColorDisabled");
  138.             tickHilite = UIManager.getColor("Slider.tickHilite");
  139.             tickShadow = UIManager.getColor("Slider.tickShadow");
  140.  
  141.             trackBorderEnabled = UIManager.getColor("Slider.trackBorderEnabled");
  142.             trackFillEnabled = UIManager.getColor("Slider.trackFillEnabled");
  143.             trackBorderDisabled = UIManager.getColor("Slider.trackBorderDisabled");
  144.             trackFillDisabled = UIManager.getColor("Slider.trackFillDisabled");
  145.             trackBevelIn = UIManager.getColor("Slider.trackBevelIn");
  146.             trackBevelOut = UIManager.getColor("Slider.trackBevelOut");
  147.         }
  148.  
  149.         super.installUI( c );
  150.         recalcTrackBuffer();
  151.  
  152.         c.addMouseListener(this);
  153.         activationHelper    = new ActivationHelper(c);
  154.         changeListener        = new ChangeListener();
  155.         activationHelper.addPropertyChangeListener(changeListener);
  156.     }
  157.  
  158.     public void uninstallUI( JComponent c )
  159.     {
  160.         super.uninstallUI( c );
  161.     
  162.         c.removeMouseListener(this);
  163.         activationHelper.removePropertyChangeListener(changeListener);
  164.         activationHelper = null;
  165.         changeListener = null;
  166.     }
  167.     
  168.     public boolean isActive()
  169.     {
  170.         return isActive;
  171.     }
  172.  
  173.     public Dimension getPreferredHorizontalSize()
  174.     {
  175.         return new Dimension(PREFERRED_LENGTH, getCurrentThumbDimensions().height + 1);
  176.     }
  177.     
  178.     public Dimension getPreferredVerticalSize()
  179.     {
  180.         return new Dimension(getCurrentThumbDimensions().width + 1, PREFERRED_LENGTH);
  181.     }
  182.     
  183.     public Dimension getMinimumHorizontalSize()
  184.     {
  185.         Dimension dim = getCurrentThumbDimensions();
  186.         return new Dimension((TRACK_OVERHANG * 2) + dim.width, dim.height + 1);
  187.     }
  188.     
  189.     public Dimension getMinimumVerticalSize()
  190.     {
  191.         Dimension dim = getCurrentThumbDimensions();
  192.         return new Dimension(dim.width + 1, (TRACK_OVERHANG * 2) + dim.height);
  193.     }
  194.  
  195.     protected void recalcTrackBuffer()
  196.     {
  197.         super.recalcTrackBuffer();
  198.  
  199.         // Now, adjust for the overhang area (because the slider extends past the thumb)
  200.         trackBuffer += TRACK_OVERHANG;
  201.     }
  202.  
  203.     public void paintThumb(Graphics g)
  204.     {
  205.         Rectangle knobBounds = getThumbRect();
  206.  
  207.         getCurrentThumbImage().paintIcon(slider, g, knobBounds.x, knobBounds.y);
  208.     }
  209.  
  210.     public void paintTrack(Graphics g)
  211.     {
  212.         Rectangle trackBounds = getScrollTrackRect();
  213.  
  214.         Color upperRightColor;
  215.         Color trackBorderColor;
  216.         Color trackFillColor;
  217.  
  218.         if (slider.getOrientation() == JSlider.HORIZONTAL)
  219.         {
  220.             trackBounds.y += (trackBounds.height - TRACK_WIDTH) / 2;
  221.             trackBounds.height = TRACK_WIDTH;
  222.             
  223.             upperRightColor = trackBevelIn;
  224.         }
  225.         else
  226.         {
  227.             trackBounds.x += (trackBounds.width - TRACK_WIDTH) / 2;
  228.             trackBounds.width = TRACK_WIDTH;
  229.             
  230.             upperRightColor = trackBevelOut;
  231.         }
  232.  
  233.         g.translate(trackBounds.x, trackBounds.y);
  234.  
  235.         if (slider.isEnabled() && isActive)
  236.         {
  237.             //
  238.             // Draw the Bevel around the track if the slider is enabled
  239.             //
  240.  
  241.             // Draw beveled-in edges:
  242.             g.setColor(trackBevelIn);
  243.             
  244.             // upper-left edge
  245.             g.drawLine(1, 0, trackBounds.width - 2, 0);
  246.             g.drawLine(0, 1, 1, 1);
  247.             g.drawLine(0, 2, 0, trackBounds.height - 2);
  248.  
  249.             // upper-right edge
  250.             g.setColor(upperRightColor);
  251.             g.drawLine(trackBounds.width - 1, 1, trackBounds.width - 1, 1);
  252.  
  253.             // Draw beveled-out edges:
  254.             g.setColor(trackBevelOut);
  255.  
  256.             // lower-left edge
  257.             g.drawLine(1, trackBounds.height - 1, 1, trackBounds.height - 1);
  258.             g.drawLine(2, trackBounds.height, trackBounds.width - 1, trackBounds.height);
  259.     
  260.             // lower-right edge
  261.             g.drawLine(trackBounds.width - 1, trackBounds.height - 1, trackBounds.width, trackBounds.height - 1);
  262.             g.drawLine(trackBounds.width, 2, trackBounds.width, trackBounds.height - 2);
  263.  
  264.             trackBorderColor = trackBorderEnabled;
  265.             trackFillColor = trackFillEnabled;
  266.         }
  267.         else
  268.         {
  269.             trackBorderColor = trackBorderDisabled;
  270.             trackFillColor = trackFillDisabled;
  271.         }
  272.  
  273.         // Draw boundary
  274.         g.setColor(trackBorderColor);
  275.         g.drawLine(2, 1, trackBounds.width - 2, 1);                                                // Top
  276.         g.drawLine(1, 2, 1, trackBounds.height - 2);                                            // Left
  277.         g.drawLine(trackBounds.width - 1, 2, trackBounds.width - 1, trackBounds.height - 2);    // Bottom
  278.         g.drawLine(2, trackBounds.height - 1, trackBounds.width - 2, trackBounds.height - 1);    // Right
  279.  
  280.         // Draw fill
  281.         g.setColor(trackFillColor);
  282.         g.fillRect(2, 2, trackBounds.width - 4, trackBounds.height - 4);
  283.  
  284.         g.translate(-trackBounds.x, -trackBounds.y);
  285.     }
  286.  
  287.     protected void paintMinorTickForHorizSlider( Graphics g, Rectangle tickBounds, int x )
  288.     {
  289.         g.setColor(slider.isEnabled() && isActive ? tickColorEnabled : tickColorDisabled);
  290.         g.drawLine( x, 0, x, 2 );
  291.     }
  292.  
  293.     protected void paintMajorTickForHorizSlider( Graphics g, Rectangle tickBounds, int x )
  294.     {
  295.         paintTick( g, x, 0, x, TICK_LENGTH - 1, slider.isEnabled());
  296.     }
  297.  
  298.     protected void paintMinorTickForVertSlider( Graphics g, Rectangle tickBounds, int y )
  299.     {
  300.         g.setColor(slider.isEnabled() && isActive ? tickColorEnabled : tickColorDisabled);
  301.         g.drawLine( 0, y, 2, y );
  302.     }
  303.  
  304.     protected void paintMajorTickForVertSlider( Graphics g, Rectangle tickBounds, int y )
  305.     {
  306.         paintTick( g, 1, y, TICK_LENGTH - 1, y, slider.isEnabled() );
  307.     }
  308.  
  309.     private void paintTick(Graphics g, int x, int y, int endX, int endY, boolean isEnabled)
  310.     {
  311.         if (isEnabled && isActive)
  312.         {
  313.             // Draw top left hilite
  314.             g.setColor(tickHilite);
  315.             g.drawLine(x - 1, y - 1, endX, y - 1);            // top hilite
  316.             g.drawLine(x - 1, y, x - 1, endY);                // left hilite
  317.             
  318.             // Draw the tick
  319.             g.setColor(tickColorEnabled);
  320.             g.drawLine(x, y, endX, endY);
  321.  
  322.             // Draw bottom right shadow
  323.             g.setColor(tickShadow);
  324.             g.drawLine(x, endY + 1, endX + 1, endY + 1);    // bottom shadow
  325.             g.drawLine(endX + 1, y, endX + 1, endY);        // right shadow
  326.         }
  327.         else
  328.         {
  329.             // Draw the tick
  330.             g.setColor(tickColorDisabled);
  331.             g.drawLine(x, y, endX, endY);
  332.         }
  333.     }
  334.  
  335.     public void paintFocus(Graphics g) {}
  336.                             
  337.     /**
  338.       * Subclasses of BasicSliderUI override this method to determine their own
  339.       * thumb size.
  340.       */
  341.     public void calculateThumbBounds()
  342.     {
  343.         int thumbX;
  344.         int thumbY;
  345.         Dimension dim = getCurrentThumbDimensions();
  346.         Rectangle trackRect = getScrollTrackRect();
  347.  
  348.         if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
  349.             thumbX = xPositionForValue(slider.getValue()) - (dim.width / 2);
  350.             thumbY = (trackRect.y + trackRect.height) - dim.height;
  351.         } else {
  352.             thumbX = (trackRect.x + trackRect.width) - dim.width;
  353.             thumbY = yPositionForValue(slider.getValue()) - (dim.height / 2);
  354.         }
  355.  
  356.         setThumbBounds(thumbX, thumbY, dim.width, dim.height);
  357.     }
  358.  
  359.     public int getTickSpace()
  360.     {
  361.         return TICK_LENGTH;
  362.     }
  363.     
  364.     /**
  365.      * Gets the height of the tick area for horizontal sliders and the width of the
  366.      * tick area for vertical sliders.  BasicSliderUI uses the returned value to
  367.      * determine the bounds of the tray rectangle and the tick area rectangle.
  368.      */
  369.     public int getTickSize()
  370.     {
  371.         return TICK_LENGTH;
  372.     }
  373.  
  374.     public void scrollByBlock(int direction)
  375.     {
  376.         synchronized(slider)
  377.         {
  378.             int oldValue = slider.getValue();
  379.             int blockIncrement = slider.getMajorTickSpacing();
  380.             if (blockIncrement == 0)
  381.                 blockIncrement = slider.getMinorTickSpacing();
  382.             if (blockIncrement == 0)
  383.                 blockIncrement = 1;
  384.             int delta = blockIncrement * ((direction > 0) ? POSITIVE_SCROLL : NEGATIVE_SCROLL);
  385.         
  386.             slider.setValue(oldValue + delta);            
  387.         }
  388.     }
  389.  
  390.     private Icon getCurrentThumbImage()
  391.     {
  392.         int orientation = slider.getOrientation();
  393.         int enabled = slider.isEnabled() && isActive ? (drawSliderPressed ? PRESSED : ENABLED) : DISABLED;
  394.         int pointer = slider.getPaintTicks() ? RIGHT /* == DOWN */ : CENTER;
  395.  
  396.         return indicatorIcons[orientation][enabled][pointer];
  397.     }
  398.  
  399.     private Dimension getCurrentThumbDimensions()
  400.     {
  401.         int orientation = slider.getOrientation();
  402.         int pointer = slider.getPaintTicks() ? RIGHT /* == DOWN */ : CENTER;
  403.  
  404.         Icon img = indicatorIcons[orientation][DISABLED][pointer];
  405.         return new Dimension(img.getIconWidth(), img.getIconHeight());
  406.     }
  407.     
  408.     class ChangeListener implements java.beans.PropertyChangeListener
  409.     {
  410.         public void propertyChange(java.beans.PropertyChangeEvent evt)
  411.         {
  412.             if(evt.getPropertyName().equals("activated"))
  413.             {
  414.                 boolean oldActive = isActive;
  415.                 isActive = ((Boolean) evt.getNewValue()).booleanValue();
  416.                 if(isActive != oldActive)
  417.                 {
  418.                     Object obj = evt.getSource();
  419.                     if(obj instanceof ActivationHelper)
  420.                     {
  421.                         ((ActivationHelper)obj).getComponent().repaint();
  422.                     }
  423.                 }
  424.             }
  425.         }
  426.     }
  427.  
  428.     /* MouseListener functions */
  429.  
  430.     public void mouseEntered(MouseEvent e) {}
  431.  
  432.     public void mouseExited(MouseEvent e) {}
  433.  
  434.     public void mouseClicked(MouseEvent e) {}
  435.  
  436.     public void mousePressed(MouseEvent e)
  437.     {
  438.         if (slider.getValueIsAdjusting())
  439.         {
  440.             drawSliderPressed = true;
  441.             slider.repaint(getThumbRect());    // Paint the slider correctly
  442.         }
  443.     }
  444.  
  445.     public void mouseReleased(MouseEvent e)
  446.     {
  447.         if (drawSliderPressed)
  448.         {
  449.             drawSliderPressed = false;
  450.             slider.repaint(getThumbRect());    // Paint the slider correctly
  451.         }
  452.     }
  453. }
  454.